A distributed system consists of multiple autonomous computers, called nodes, which communicate through a computer network. Each computer has its own local memory, and communicates with the other computers by message passing. A distributed system may have a common goal, such as solving a large computational problem. Alternatively, each computer may have its own user with individual needs, such that the purpose of the distributed system is the coordinating of the use of shared resources or provisioning of communication services to the users. The distributed system may consist of different kinds of computers and network links, and the system may change during the execution of a distributed program. Therefore, the structure of the distributed system (network topology, network latency, number of computers) may not be known in advance. Each computer has only a limited, incomplete view of the system. There are many cases in which the use of a single computer would be possible in principle, but the use of a distributed system is beneficial for practical reasons. For example, obtaining a desired level of performance may be more cost-efficient through the use of a cluster of several low-end computers, in comparison to a single high-end computer. A distributed system can be more reliable than a non-distributed system because a distributed system has no single point of failure. Moreover, a distributed system may be easier to expand and manage than a monolithic uniprocessor system. A distributed system user may execute a backup application to create a backup for the distributed system and execute a restore application to restore the distributed system from a previous backup for the distributed system.